package com.elloe.实现二叉树的Node节点.非递归前序遍历;

import com.elloe.实现二叉树的Node节点.Node的Java实现.Node;

import java.util.Stack;

/**
 * @author ElloeStudy(Sifa Zhang)
 * @create 2022-04-09 15:12
 * To: 真常应物，真常得性，常清常静，常清静矣
 */
public class TraversalBeforeByLoop {
    public void  beforeTraversalByLoop(Node node){
        // 创建栈保存遍历的节点,但又没有遍历完全的节点（即这个节点还没有操作完，临时保存一下）
        Stack<Node> stack = new Stack<>();
        Node present = node;  // 当前的节点
        while (present != null || !stack.isEmpty()){
            // 当前的节点不为null 且 栈不为空

            while (present != null){
                // 当 当前的节点不为null时，读取present的值,
                // 并不断更新present为其左子节点（不断读取左节点的值）

                // 读取根节点
                System.out.println(present.getValue() + " ");
                stack.push(present); // 将present压入栈（此时这个节点还没有操作好，临时保存）
                present = present.getLeft(); // 读取当前节点的左节点
            }

            if (!stack.isEmpty()){
                // 当栈不为空时
                present = stack.pop(); // 将临时保存的数取出
                present = present.getRight();  // 操作临时保存的节点的右节点（此时左节点已经全部读取好了）
            }
        }
    }
}
